package org.dragonnova.lamp.utils;

import android.util.Log;

import java.util.Locale;

/**
 * Created by hucn on 2016/3/8.
 * Description:一个用于打印log的工具类
 */
public class LogUtil {

    private LogUtil() {
        //cannot be instantiated
        throw new UnsupportedOperationException("cannot be instantiated");
    }

    public static boolean isDebug = true;// 是否需要打印bug，可以在application的onCreate函数里面初始化
    private static boolean LOGV = true;
    private static boolean LOGD = true;
    private static boolean LOGI = true;
    private static boolean LOGW = true;
    private static boolean LOGE = true;
    private static final String TAG = "default";

    // 下面五个是默认tag的函数
    public static void v(String msg) {
        if (isDebug || LOGV)
            Log.v(TAG, msg);
    }

    public static void i(String msg) {
        if (isDebug || LOGI)
            Log.i(TAG, msg);
    }

    public static void d(String msg) {
        if (isDebug || LOGD)
            Log.d(TAG, msg);
    }

    public static void w(String msg) {
        if (isDebug || LOGW)
            Log.w(TAG, msg);
    }

    public static void e(String msg) {
        if (isDebug || LOGE)
            Log.e(TAG, msg);
    }

    // 下面是传入自定义tag的函数
    public static void v(String tag, String msg) {
        if (isDebug || LOGV)
            Log.v(tag, msg);
    }

    public static void i(String tag, String msg) {
        if (isDebug || LOGI)
            Log.i(tag, msg);
    }

    public static void d(String tag, String msg) {
        if (isDebug || LOGD)
            Log.d(tag, msg);
    }

    public static void w(String tag, String msg) {
        if (isDebug || LOGW)
            Log.w(tag, msg);
    }

    public static void e(String tag, String msg) {
        if (isDebug || LOGE)
            Log.e(tag, msg);
    }

    //不传入tag的自动获取以类名为tag的log方法
    public static void vv(String msg) {
        if (isDebug || LOGV) {
            Log.v(getTag(), msg);
        }
    }

    public static void dd(String msg) {
        if (isDebug || LOGD) {
            Log.d(getTag(), msg);
        }
    }

    public static void ii(String msg) {
        if (isDebug || LOGI) {
            Log.i(getTag(), msg);
        }
    }

    public static void ww(String msg) {
        if (isDebug || LOGW) {
            Log.w(getTag(), msg);
        }
    }

    public static void ee(String msg) {
        if (isDebug || LOGE) {
            Log.e(getTag(), msg);
        }
    }

    //打印线程，方法名等信息的log
    public static void vvv(String msg) {
        if (isDebug || LOGV) {
            Log.v(getTag(), buildMessage(msg));
        }
    }

    public static void ddd(String msg) {
        if (isDebug || LOGD) {
            Log.d(getTag(), buildMessage(msg));
        }
    }

    public static void iii(String msg) {
        if (isDebug || LOGI) {
            Log.i(getTag(), buildMessage(msg));
        }
    }

    public static void www(String msg) {
        if (isDebug || LOGW) {
            Log.w(getTag(), buildMessage(msg));
        }
    }

    public static void eee(String msg) {
        if (isDebug || LOGE) {
            Log.e(getTag(), buildMessage(msg));
        }
    }

    //获取调用者的类名
    private static String getTag() {
        StackTraceElement[] trace = new Throwable().fillInStackTrace()
                .getStackTrace();
        String callingClass = "";
        for (int i = 2; i < trace.length; i++) {
            Class<?> clazz = trace[i].getClass();
            if (!clazz.equals(LogUtil.class)) {
                callingClass = trace[i].getClassName();
                //callingClass = callingClass.substring(callingClass.lastIndexOf('.') + 1);
                break;
            }
        }
        return callingClass;
    }

    //获取线程，方法名
    private static String buildMessage(String msg) {
        StackTraceElement[] trace = new Throwable().fillInStackTrace()
                .getStackTrace();
        String caller = "";
        for (int i = 2; i < trace.length; i++) {
            Class<?> clazz = trace[i].getClass();
            if (!clazz.equals(LogUtil.class)) {
                caller = trace[i].getMethodName();
                break;
            }
        }
        return String.format(Locale.CHINA, "[%d] %s: %s", Thread.currentThread()
                .getId(), caller, msg);
    }
}
